/* Header file of LinkedList. This module is responsible for a generic linked list */

#include "Common.h"

/* Element in the list */
typedef struct Element_s
{
	void* data; /* Generic data */
	Element_s* Next; /* Next in the list */
	Element_s* Previous; /* Previous in the list */
}Element, *pElement;

/* Linked list */
typedef struct LinkedList_s
{
	Element* head; /* Head of the list */
	Element* tail; /* tail of the list */
	BOOL (*Equal)(void*,void*); /* Function pointer for implementing Equal - it used for Search or ContainsData */
}LinkedList, *pLinkedList;

/*********************************************************************************************************************** */
/* Description: Initialize the linked list */
/* Input/Output: list - List to initialize
/*********************************************************************************************************************** */
void InitList(pLinkedList list);
/*********************************************************************************************************************** */
/* Description: Insert a node to the linked list */
/* Input/Output: list - List to update */
/* Input:		 data - data of the element */
/*********************************************************************************************************************** */
void Insert(pLinkedList list, void* data);
/*********************************************************************************************************************** */
/* Description: Check if data exists in the list */
/* Input/Output: list - List to search */
/* Input:		 data - data to find */
/*********************************************************************************************************************** */
BOOL ContainsData(pLinkedList list, void* data);
/*********************************************************************************************************************** */
/* Description: Frees all the memory of the linked list */
/* Input/Output: list - List to search */
/*********************************************************************************************************************** */
void DeleteList(pLinkedList list);

/*********************************************************************************************************************** */
/* Description: Search  element in the list */
/* Input/Output: list - List to search */
/* Input:		 data - data to find */
/*********************************************************************************************************************** */
pElement Search(pLinkedList list, void* data);

/*********************************************************************************************************************** */
/* Description: Compares to strings */
/* Input/Output: str1 - first string */
/* Input:		 str2 - second string */
/*********************************************************************************************************************** */
BOOL EqualString(void* str1, void* str2);


pElement Remove(pLinkedList list, pElement current);